/**
 * 鉴权服务器
 */
var uuid = require('node-uuid');
var express = require('express');
var dateHelper = require('./helper/dateHelper');
var redisHelper = require('./helper/redisHelper');

redisHelper = new redisHelper();  // redis工具类闭包

/**
 *  和zilla云，私有云版本（保持一致，一个租户就一个推送）
 */
// var APP_ID = "43ea5ef81c2e036a93de068f7dd739be";
// var APP_SECRET = "ab3194ab-c4c9-4b1f-9a99-5a625bae2c60";
var APP_ID = require('./config/config').APP_ID;
var APP_SECRET = require('./config/config').APP_SECRET;

// 捕捉全局异常
process.on('uncaughtException', function(err) {
	console.error('uncaughtException: ' + err);
});

var app = express();
app.use(express.bodyParser()); // 使用中间件

/*
 * 三种用例：
 *     1. 只验证应用：appId, secret, username, deviceId
 *     2. 验证用户身份：appId, secret, deviceId, username, password
 *     3. 通过token验证用户身份：appId, secret, deviceId, username, accessToken（过滤了一遍请求权限）
 *
 * 整体流程：
 * 	1.注册应用（表单提交usr、pwd、deviceId...），后台动态生成appkey、secret，动态设置到SDK配置文件
 *	2.验证应用，鉴权usr、pwd、appkey...返回token
 *	3.登入会话，长连接，token验证，上传设备、用户信息等相关信息
 *	4.查看状态（在线、离线）、推送消息、消息状态（不在线即保存消息，下次离线推送、回执即更新消息状态）
 */
app.post('/authenticate', function(req, res) {
	console.log('\nAuth.----------------------------------------------> ' + dateHelper.getNowFormatTime());
	console.log('Request：request coming：' + req.ip);
	console.log('Request body:');
	console.log(req.body);

	// 验证设备，唯一标识 Hash(deviceId_pushToken, push_Token)
	var deviceId = req.body.deviceId;
	var username = req.body.username;

	if (APP_ID !== req.body.appId || APP_SECRET !== req.body.secret || deviceId === undefined || deviceId === '' || username === undefined || username === '') {
		res.status(401).json({'message': 'app validation fail. please check query params'});
		return;
	};

	var push_Token = uuid.v4(); // 生成token令牌

	/**
	 * 缓存token鉴权令牌
	 */
	redisHelper.set(username + deviceId + '_pushToken' , push_Token + '@' + new Date().getTime(), '', function(error, reply) { // 已最后一次鉴权用户为主，覆盖之前
		if(!error) {
			console.log('resdis save [token]...' + push_Token);
			res.status(200).json({"result": true, "host": "121.199.39.92", "port": 8868, "push_Token": push_Token, 'expired': dateHelper.getNowFormatTime(), 'expired_day': 1}); // 缓存一天
		} else {
			console.error('redis set error [token]...' + reply);
			res.status(500).json({'result': false, 'message': 'server exception. redis net exc that maybe connection disable.'});
		}
	});
});

/*
 * API服务: 注册表单，动态生成APPKey
 */
// app.get('/api', function(req, res) {});

//######## commonjs interface #################
module.exports = function() {
	app.listen(/*process.env.PORT || */8867);
	console.log('instant-auth is up.port：8867');
};



